//Given a string queryIP, return "IPv4" if IP is a valid IPv4 address, "IPv6" 
//if IP is a valid IPv6 address or "Neither" if IP is not a correct IP of any type. 
//
//
// A valid IPv4 address is an IP in the form "x1.x2.x3.x4" where 0 <= xi <= 255 
//and xi cannot contain leading zeros. For example, "192.168.1.1" and "192.168.1.0
//" are valid IPv4 addresses while "192.168.01.1", "192.168.1.00", and "192.168@1.
//1" are invalid IPv4 addresses. 
//
// A valid IPv6 address is an IP in the form "x1:x2:x3:x4:x5:x6:x7:x8" where: 
//
// 
// 1 <= xi.length <= 4 
// xi is a hexadecimal string which may contain digits, lowercase English 
//letter ('a' to 'f') and upper-case English letters ('A' to 'F'). 
// Leading zeros are allowed in xi. 
// 
//
// For example, "2001:0db8:85a3:0000:0000:8a2e:0370:7334" and "2001:db8:85a3:0:0
//:8A2E:0370:7334" are valid IPv6 addresses, while "2001:0db8:85a3::8A2E:037j:7334
//" and "02001:0db8:85a3:0000:0000:8a2e:0370:7334" are invalid IPv6 addresses. 
//
// 
// Example 1: 
//
// 
//Input: queryIP = "172.16.254.1"
//Output: "IPv4"
//Explanation: This is a valid IPv4 address, return "IPv4".
// 
//
// Example 2: 
//
// 
//Input: queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
//Output: "IPv6"
//Explanation: This is a valid IPv6 address, return "IPv6".
// 
//
// Example 3: 
//
// 
//Input: queryIP = "256.256.256.256"
//Output: "Neither"
//Explanation: This is neither a IPv4 address nor a IPv6 address.
// 
//
// 
// Constraints: 
//
// 
// queryIP consists only of English letters, digits and the characters '.' and 
//':'. 
// 
//
// Related Topics 字符串 👍 234 👎 0

package leetcode.editor.cn;

class P468ValidateIpAddress {
    //2023-05-17 21:37:57
    //Validate IP Address
    //编号：[468]

    public static void main(String[] args) {

        Solution solution = new P468ValidateIpAddress().new Solution();
        // TO TEST
        System.out.println(solution.validIPAddress("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String validIPAddress(String queryIP) {
            if (queryIP.contains(".") && ipv4(queryIP)) {
                return "IPv4";
            }
            if (queryIP.contains(":") && ipv6(queryIP)) {
                return "IPv6";
            }
            return "Neither";
        }

        public Boolean ipv4(String ip) {
            String[] split = ip.split("\\.", -1);
            if (split.length == 4) {
                for (int i = 0; i < split.length; i++) {
                    String str = split[i];
                    if (str.length() == 0 || str.length() > 3) {
                        return false;
                    }
                    for (int j = 0; j < str.length(); j++) {
                        char c = str.charAt(j);
                        if (j == 0 && c == '0' && str.length() != 1) {
                            return false;
                        }
                        if (!Character.isDigit(c)) {
                            return false;
                        }
                    }
                    int out = Integer.parseInt(str);
                    if (!(out >= 0 && out <= 255)) {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }

        public Boolean ipv6(String ip) {
            String[] split = ip.split(":", -1);
            String valid = "ABCDEFabcdef0123456789";
            if (split.length == 8) {
                for (int i = 0; i < split.length; i++) {
                    String str = split[i];
                    if (str.length() == 0 || str.length() > 4) {
                        return false;
                    }
                    for (int j = 0; j < str.length(); j++) {
                        char c = str.charAt(j);
                        if (valid.indexOf(c) == -1) {
                            return false;
                        }
                    }
                }
                return true;
            }
            return false;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}